package com.example.medical_project.modules.system.service.impl;

import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.medical_project.commons.constant.Constants;
import com.example.medical_project.modules.system.domain.Menu;
import com.example.medical_project.modules.system.domain.Role;
import com.example.medical_project.modules.system.domain.User;
import com.example.medical_project.modules.system.dto.LoginDto;
import com.example.medical_project.modules.system.mapper.MenuMapper;
import com.example.medical_project.modules.system.mapper.RoleMapper;
import com.example.medical_project.modules.system.service.UserService;
import com.example.medical_project.modules.system.mapper.UserMapper;

import com.example.medical_project.modules.system.vo.ActiveUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Objects;

/**
* @author 86157
* @description 针对表【sys_user(用户信息表)】的数据库操作Service实现
* @createDate 2025-01-08 16:42:27
*/
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User>
    implements UserService{

    @Autowired
    private RoleMapper roleMapper;

    @Autowired
    private MenuMapper menuMapper;

    @Override
    public User login(LoginDto loginDto) {

        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();

        queryWrapper.eq(User::getPhone,loginDto.getUsername());
        queryWrapper.eq(User::getPassword,loginDto.getPassword());


        return this.getOne(queryWrapper);

//        User loginUser = this.getOne(queryWrapper);

//        以下为加密代码目前需要时可以使用
//        if(Objects.nonNull(loginUser)){
//            /**
//             * 密码比对思路
//             * 1，用户输入密码+salt 摘要生成密码
//             * 2，生成密码和数据库密码比
//             * 相等：登录成功
//             * 不相等：账号密码错误
//             */
//            String password = loginDto.getPassword()+loginUser.getSalt();
//
//            String md5Password = SecureUtil.md5(password);
//
//            if(loginUser.getPassword().equals(md5Password)){
//
//                return loginUser;
//            }
//
//        }
//        return null;
    }

    @Override
    public ActiveUser getActiveUser() {

        long userId = StpUtil.getLoginIdAsLong();
        User user = getById(userId);

        ActiveUser activeUser = new ActiveUser();
        activeUser.setUser(user);

//        查询用户角色
        List<Role> roles = roleMapper.selectRolesByUserId(userId);

        List<String> roleNames = roles.stream().map(Role::getRoleName).toList();
        activeUser.setRoles(roleNames);

        List<Menu> menuList = menuMapper.selectMenusByUserId(userId);
        List<String> menuNames = menuList.stream().map(Menu::getMenuName).toList();
        activeUser.setPermissions(menuNames);
        String jsonPrettyStr = JSONUtil.toJsonPrettyStr(activeUser);

        System.out.println(jsonPrettyStr);


        return activeUser;
    }

    @Override
    public List<Menu> getMenus() {

        Long userId = StpUtil.getLoginIdAsLong();

        User user = getById(userId);
//        如果是超级管理员查询所有菜单
        if(Constants.USER_ADMIN.equals(user.getUserType())){
            return menuMapper.selectList(null);

//
        }
//        普通管理员
        return menuMapper.selectMenusByUserId(userId);

    }

}




